package com.woniuxy.access.service.impl;
import java.time.LocalDateTime;
import java.util.Date;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.woniuxy.access.entity.TradeLog;
import com.woniuxy.access.mapper.TradeLogMapper;
import com.woniuxy.access.service.ITradeLogService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.common.model.dto.bank.BankCardAddDTO;
import com.woniuxy.common.model.dto.bank.BankReqDto;
import com.woniuxy.common.model.dto.bank.BaseResult;
import com.woniuxy.common.model.dto.bank.SignatureDto;
import com.woniuxy.common.model.vo.trade.BorrowSyncRecordVo;
import com.woniuxy.common.result.Result;
import com.woniuxy.common.utils.EncryptUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

/**
 * <p>
 * 托管系统交易记录表 服务实现类
 * </p>
 *
 * @author yellow docker
 * @since 2025-03-20
 *
 *    1、记录日志
 *    2、访问银行系统
 */
@Slf4j
@Service
public class TradeLogServiceImpl extends ServiceImpl<TradeLogMapper, TradeLog> implements ITradeLogService {

    @Autowired
    private RestTemplate restTemplate;
    /**
     * 绑卡操作
     * @param bankCardAddDTO
     * @return
     */
    @Override
    public SignatureDto proxyBindCardLog(BankCardAddDTO bankCardAddDTO) {

        //01 创建日志

        TradeLog tradeLog = new TradeLog();

        tradeLog.setReqCode(bankCardAddDTO.getReqCode());
        //USER_BIND_CARD 绑卡指定字符串
        tradeLog.setReqType("USER_BIND_CARD");
        //userId
        tradeLog.setObjectId(bankCardAddDTO.getUserId());

        //日志时间
        tradeLog.setCreateDate(LocalDateTime.now());

        //银行返回数据 需要 对下面的数据进行更新
        //数据同步状态
        tradeLog.setSynchronizeStatus(0);
        //确认时间
        tradeLog.setConfirmDate(LocalDateTime.now());
        tradeLog.setResponseData("");

        // 保存日志
        save(tradeLog);

        //默认访问银行系统
        SignatureDto signatureDto = new SignatureDto();
        signatureDto.setBankUrl("http://localhost:5600");
        signatureDto.setPlatformNo("ICBC");
        signatureDto.setReqData("{\"success\":\"绑卡成功\"}");
        signatureDto.setReqCode(bankCardAddDTO.getReqCode());

        return signatureDto;
    }

    @Override
    public Result syncBorrowRecord(BorrowSyncRecordVo borrowSyncRecordVo) {

        //01、记录日志
        TradeLog tradeLog = new TradeLog();
        tradeLog.setReqCode(borrowSyncRecordVo.getReqCode());

        //数据同步  SYNC
        tradeLog.setReqType("SYNC");
        //用户id
        tradeLog.setObjectId(borrowSyncRecordVo.getUserId());
        //日志时间
        tradeLog.setCreateDate(LocalDateTime.now());
        //同步状态  (银行系统发挥数据 才会更新)
//        tradeLog.setSynchronizeStatus(0);
//        tradeLog.setConfirmDate(LocalDateTime.now());
//        tradeLog.setResponseData("");

        save(tradeLog);
        //02 访问银行系统
        //2.1 请求基础路径；作为完成路径的一部分
        String url = "http://localhost:5600/service";
        //2.2 发送数据给银行系统  看银行系统
        // url:  /service    serviceName= xxx服务(SYNC_BORROW_RECODE)
        // 请求数据:reqData
        // String url = "http://ip:5600/service?serviceName=SYNC_BORROW_RECODE&reqData=xxx";

        //2.3 请求数据 - 对象转换为JSON， 使用alibaba提供的fastjson工具类(银行托管也是使用fastjson)
        String str = JSON.toJSONString(borrowSyncRecordVo);
        //2.4 对象加密处理： str ---> Base64编码 ---> URL编码 ---> 目标str
        // str ---> Base64编码
        String base64Str = EncryptUtil.encodeUTF8StringBase64(str);
        // Base64编码 ---> URL编码
        String reqData = EncryptUtil.encodeURL(base64Str);
        // url:  /service    serviceName= xxx服务(SYNC_BORROW_RECODE)
        url = "http://localhost:5600/service?serviceName=SYNC_BORROW_RECORD&reqData=" + reqData;
        log.info("发送数据的url:{}",url);

        // 银行系统使用的是 @RestController 把对象都转成 json 字符串
        String respBody = restTemplate.getForObject(url, String.class);

        log.info("银行系统返回的数据:{}",respBody);
        BankReqDto bankReqDto = JSON.parseObject(respBody, BankReqDto.class);
        //拿到字符串解析
        BaseResult baseResult = JSON.parseObject(bankReqDto.getRespData(), BaseResult.class);
        log.info("银行系统返回的数据进行解析:{}",baseResult);

        //判断 baseResult 更新
        // tradeLog.setSynchronizeStatus(0);
        // tradeLog.setConfirmDate(LocalDateTime.now());
        // tradeLog.setResponseData("");

        if (baseResult.getRespMsg().equals("成功")){
            update(
                    Wrappers.lambdaUpdate(TradeLog.class)
                            .set(TradeLog::getConfirmDate,new Date())  //确认时间
                            .set(TradeLog::getSynchronizeStatus,1)     //数据同步
                            .set(TradeLog::getResponseData,bankReqDto.getRespData()) //银行返回的数据

            );
        }
        return Result.ok(baseResult);
    }
}
